package cn.yuanyu.es;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;

/**
 * @author baker.yuan
 */

public class ElasticSearchClientTest {

    // 官方明确表示在ES 7.0版本中将弃用TransportClient客户端，且在8.0版本中完全移除它。
    // https://elasticsearch.cn/topic/transport+client
    // https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.4/java-search-template.html

    private TransportClient client;

    /**
     * 初始化TransportClient
     */
    @Before
    public void init() throws Exception {
        //1、创建一个Settings对象，相当于是一个配置信息。主要配置集群的名称。
        Settings settings = Settings.builder()
                .put("cluster.name", "boot_test")
                .build();
        //2、创建一个客户端Client对象，集群需要指定多个
        client = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("121.36.33.154"), 9300));
                //.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302))
                //.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303));

    }

    /**
     * 使用client对象创建一个索引库
     */
    @Test
    public void createIndex() throws Exception {
        //3、
        client.admin().indices().prepareCreate("index_hello")
                //执行操作
                .get();
        //4、关闭client对象
        client.close();
    }


    /**
     * 创建一个Mappings信息
     */
    @Test
    public void setMappings() throws Exception {
        /*
            {
                "article": {
                    "properties": {
                        "id": {
                            "type": "long",
                            "store": true
                        },
                        "title": {
                            "type": "text",
                            "store": true,
                            "index": true,
                            "analyzer": "ik_smart"
                        },
                        "content": {
                            "type": "text",
                            "store": true,
                            "index": true,
                            "analyzer": "ik_smart"
                        }
                    }
                }
            }
        */
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("article")
                        .startObject("properties")
                            .startObject("id")
                                .field("type","long")
                                .field("store", true)
                            .endObject()
                            .startObject("title")
                                .field("type", "text")
                                .field("store", true)
                                .field("analyzer", "ik_smart")
                            .endObject()
                            .startObject("content")
                                .field("type", "text")
                                .field("store", true)
                                .field("analyzer","ik_smart")
                            .endObject()
                        .endObject()
                    .endObject()
                .endObject();
        //使用client把mapping信息设置到索引库中
        client.admin().indices()
                //设置要做映射的索引
                .preparePutMapping("index_hello")
                //设置要做映射的type
                .setType("article")
                //mapping信息，可以是XContentBuilder对象可以是json格式的字符串
                .setSource(builder)
                //执行操作
                .get();
        //关闭链接
        client.close();
    }

    /**
     *
     */
    @Test
    public void testAddDocument() throws Exception {
        //创建一个文档对象
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .field("id", 2L)
                    .field("title","习近平致信祝贺“奋斗者”号完成万米海试")
                    .field("content", "新华社三亚11月28日电“奋斗者”号全海深载人潜水器成功完成万米海试并于28日胜利返航。中共中央总书记、国家主席、中央军委主席习近平发来贺信，致以热烈的祝贺，向所有致力于深海装备研发、深渊科学研究的科研工作者致以诚挚的问候。")
                .endObject();
        //把文档对象添加到索引库
        client.prepareIndex()
                //设置索引名称
                .setIndex("index_hello")
                //设置type
                .setType("article")
                //设置文档的id，如果不设置的话自动的生成一个id
                .setId("2")
                //设置文档信息
                .setSource(builder)
                //执行操作
                .get();
        //关闭客户端
        client.close();
    }

    /**
     *
     */
    @Test
    public void testAddDocument2() throws Exception {
        //创建一个Article对象
        Article article = new Article();
        //设置对象的属性
        article.setId(3L);
        article.setTitle("全部及格！中国城市绿色低碳发展成绩单来了");
        article.setContent("今天（27号），中国社科院、国家气象局气候变化经济学模拟联合实验室以及社会科学文献出版社，在京发布了第十二部气候变化绿皮书——《应对气候变化报告（2020）》。今年的主题是提升气候行动力。");

        //把article对象转换成json格式的字符串。
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonDocument = objectMapper.writeValueAsString(article);
        System.out.println(jsonDocument);
        //使用client对象把文档写入索引库
        client.prepareIndex("index_hello","article", "3")
                .setSource(jsonDocument, XContentType.JSON)
                .get();
        //关闭客户端
        client.close();
    }

    /**
     *
     */
    @Test
    public void testAddDocument3() throws Exception {
        for (int i = 4; i < 100; i++) {
            //创建一个Article对象
            Article article = new Article();
            //设置对象的属性
            article.setId((long) i);
            article.setTitle("一杯咖啡里的脱贫故事 为北京榜样点赞" + i);
            article.setContent("在“全国832个贫困县全部脱贫摘帽”的喜讯传来之际，“复兴路上工作室”与“中国好故事”数据库联合推出最新力作——中英双语动画短视频《一杯咖啡里的脱贫故事》。讲述百年前从西方引入中国云南的咖啡豆开启全球之旅，助力当地民众摆脱贫困、过上好日子的故事。" + i);
            //把article对象转换成json格式的字符串。
            ObjectMapper objectMapper = new ObjectMapper();
            String jsonDocument = objectMapper.writeValueAsString(article);
            System.out.println(jsonDocument);
            //使用client对象把文档写入索引库
            client.prepareIndex("index_hello","article", i + "")
                    .setSource(jsonDocument, XContentType.JSON)
                    .get();
        }
        //关闭客户端
        client.close();
    }
}
